/**
 *                                         ,s555SB@@&
 *                                      :9H####@@@@@Xi
 *                                     1@@@@@@@@@@@@@@8
 *                                   ,8@@@@@@@@@B@@@@@@8
 *                                  :B@@@@X3hi8Bs;B@@@@@Ah,
 *             ,8i                  r@@@B:     1S ,M@@@@@@#8;
 *            1AB35.i:               X@@8 .   SGhr ,A@@@@@@@@S
 *            1@h31MX8                18Hhh3i .i3r ,A@@@@@@@@@5
 *            ;@&i,58r5                 rGSS:     :B@@@@@@@@@@A
 *             1#i  . 9i                 hX.  .: .5@@@@@@@@@@@1
 *              sG1,  ,G53s.              9#Xi;hS5 3B@@@@@@@B1
 *               .h8h.,A@@@MXSs,           #@H1:    3ssSSX@1
 *               s ,@@@@@@@@@@@@Xhi,       r#@@X1s9M8    .GA981
 *               ,. rS8H#@@@@@@@@@@#HG51;.  .h31i;9@r    .8@@@@BS;i;
 *                .19AXXXAB@@@@@@@@@@@@@@#MHXG893hrX#XGGXM@@@@@@@@@@MS
 *                s@@MM@@@hsX#@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@&,
 *              :GB@#3G@@Brs ,1GM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@B,
 *            .hM@@@#@@#MX 51  r;iSGAM@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@8
 *          :3B@@@@@@@@@@@&9@h :Gs   .;sSXH@@@@@@@@@@@@@@@@@@@@@@@@@@@@@@:
 *      s&HA#@@@@@@@@@@@@@@M89A;.8S.       ,r3@@@@@@@@@@@@@@@@@@@@@@@@@@@r
 *   ,13B@@@@@@@@@@@@@@@@@@@5 5B3 ;.         ;@@@@@@@@@@@@@@@@@@@@@@@@@@@i
 *  5#@@#&@@@@@@@@@@@@@@@@@@9  .39:          ;@@@@@@@@@@@@@@@@@@@@@@@@@@@;
 *  9@@@X:MM@@@@@@@@@@@@@@@#;    ;31.         H@@@@@@@@@@@@@@@@@@@@@@@@@@:
 *   SH#@B9.rM@@@@@@@@@@@@@B       :.         3@@@@@@@@@@@@@@@@@@@@@@@@@@5
 *     ,:.   9@@@@@@@@@@@#HB5                 .M@@@@@@@@@@@@@@@@@@@@@@@@@B
 *           ,ssirhSM@&1;i19911i,.             s@@@@@@@@@@@@@@@@@@@@@@@@@@S
 *              ,,,rHAri1h1rh&@#353Sh:          8@@@@@@@@@@@@@@@@@@@@@@@@@#:
 *            .A3hH@#5S553&@@#h   i:i9S          #@@@@@@@@@@@@@@@@@@@@@@@@@A.
 *
 *
 *    又看源码，看你妹妹呀！
 */


import localforage from 'localforage';
import CryptoJS from 'crypto-js';

const storage = {
    encrypt: function (value) {
        let encryptKey = 'luhanhaoshuai123';
        let keyHex = CryptoJS.enc.Utf8.parse(encryptKey);
        let encrypted = CryptoJS.DES.encrypt(value, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        return encrypted.toString();
    },
    decrypted: function (data) {
        let encryptKey = 'luhanhaoshuai123';
        let keyHex = CryptoJS.enc.Utf8.parse(encryptKey);
        var decrypted = CryptoJS.DES.decrypt(data, keyHex, {
            mode: CryptoJS.mode.ECB,
            padding: CryptoJS.pad.Pkcs7
        });
        let outputValue = '';
        try {
            outputValue = JSON.parse(CryptoJS.enc.Utf8.stringify(decrypted));
        } catch (e) {
            outputValue = CryptoJS.enc.Utf8.stringify(decrypted);
        }
        return outputValue;
    },
    set: function (key, value) {
        return new Promise((resolve, reject) => {
            value = JSON.stringify(value);
            let saveValue = this.encrypt(value);
            localforage.setItem(key, saveValue).then(() => {
                resolve();
            })
        })
    },
    get: function (key) {
        return new Promise((resolve, reject) => {
            localforage.getItem(key).then((data) => {
                if (data) {
                    resolve(this.decrypted(data))
                } else {
                    resolve('')

                }
            })
        })
    },
    ss_set: function (key, value) {
        return new Promise((resolve, reject) => {
            sessionStorage.setItem(key, JSON.stringify(value))
            resolve()
        })
    },
    ss_get: function (key) {
        return new Promise((resolve, reject) => {
            let value = JSON.parse(sessionStorage.getItem(key))
            if (!value) {
                resolve('')
            } else {
                resolve(value)
            }
        })
    },
    getUser: function () {
        return new Promise((resolve, reject) => {
            // console.count('getuserTime')
            let user = '';
            this.ss_get('user').then((ss_user) => {
                if (!ss_user) {
                    this.get('user').then((user) => {
                        resolve(user)
                    })
                } else {
                    resolve(ss_user)

                }
            });
        })
    },
    updateUser: function (user) {
        return new Promise((resolve, reject) => {
            this.ss_get('user').then((ss_user) => {
                if (!ss_user) {
                    this.set('user', user).then(() => {
                        resolve()
                    })
                } else {
                    this.ss_set('user', user).then(() => {
                        resolve()
                    })
                }
            });
        })
    },
    clearUser: function () {
        return new Promise((resolve, reject) => {
            this.ss_get('user').then((ss_user) => {
                if (ss_user) {
                    sessionStorage.removeItem('user')
                    resolve();
                } else {
                    this.get('user').then((user) => {
                        if (user) {
                            localforage.removeItem('user').then(() => {
                                resolve();
                            })
                        } else {
                            resolve();
                        }
                    }, () => {
                        resolve();
                    })
                }
            });
        })

    }

}
export default storage;
